package com.zhenxiang.juc.threadpool;

import java.util.concurrent.*;

/**
 * @Author : James
 * @Create : 2021-12-23-14:53
 * @Description :
 *  Executors 工具类、3大方法
 *  线程池 不允许 用Executors 来创建线程 阿里巴巴编码规范
 *
 *   拒绝策略
 *   1、new ThreadPoolExecutor.AbortPolicy()  直接拒绝处理  会抛出异常，默认实现方式
 *   2、new ThreadPoolExecutor.CallerRunsPolicy()  哪里来的回哪里去
 *   3、new ThreadPoolExecutor.DiscardPolicy()   队列满了，丢掉任务，不会抛出异常！
 *   4、new ThreadPoolExecutor.DiscardOldestPolicy()  队列满了，尝试去和最早的竞争，也不会 抛出异常！
 *
 *
 *
 *
 */
public class Demo01 {
    public static void main(String[] args) {

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                // 核心线程数 默认值 1
                1,
                // 最大线程数 默认值 Integer.MAX_VALUE
                3,
                // 超过core size的那些线程，任务完成后，再经过这个时长（秒）会被结束掉
                3,
                TimeUnit.SECONDS,
                // 阻塞队列 当最小的线程数已经被占用满后，新的任务会被放进queue里面，
                new LinkedBlockingDeque(20),
                // 线程工厂
                Executors.defaultThreadFactory(),
                // 拒绝策略  有四种 队列满了尝试和最早的去竞争 不会抛出异常
                new ThreadPoolExecutor.DiscardOldestPolicy());

        try {
            // 最大承载 LinkedBlockingDeque容量+ max
            // 超过了就会按照配置的 拒绝策略进行处理
            for (int i = 0; i < 100; i++) {
                threadPoolExecutor.execute(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + " ok");
                        System.out.println("最大线程数==="+threadPoolExecutor.getLargestPoolSize());
                        System.out.println("已经执行完毕的任务个数=="+threadPoolExecutor.getCompletedTaskCount());
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPoolExecutor.shutdown();
        }

    }
}
